﻿using System;

public class Enprypt
{
        #region DEC加密
        public static string DecEncrypt(string strToEncrypt)
        //只支持8个字节的加密密匙
        {
            string strKey = "MTYSYXGS";//访问数据加密标准（DES）算法的加密服务提供程序（CSP）版本的包装对象
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            des.Key = ASCIIEncoding.ASCII.GetBytes(strKey);//建立加密对象的密匙和偏移量
            des.IV = ASCIIEncoding.ASCII.GetBytes(strKey);//原文使用ASCIIEncoding.ASCII.GetBytes的方法加密
            byte[] inputByteArray = Encoding.Default.GetBytes(strToEncrypt);//把原文字符串编码为一个个字节序列，放到数组中
            MemoryStream ms = new MemoryStream();//创建支持存储区为内存的流
            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);//以上两步完成把加密后的结果放到内存中去
            StringBuilder strBd = new StringBuilder();//定义可变字符字符串
            foreach (byte b in ms.ToArray())
            {
                strBd.AppendFormat("{0:X2}", b);//将b转换成字符串表现形式
            }
            strBd.ToString();
            return strBd.ToString();//返回加密后的字符串
        }

        #endregion

        #region DEC解密
        //只支持8个字节的密匙
        public static string DECDecrypt(string strToDecrypt)
        {
            string strKey = "MTYSYXGS";
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();//访问数据加密标准（DES）算法的加密服务提供程序（CSP）版本的包装对象
            byte[] inputByteArray = new byte[strToDecrypt.Length / 2];
            for (int i = 0; i < strToDecrypt.Length / 2; i++)
            {
                int j = (Convert.ToInt32(strToDecrypt.Substring(i * 2, 2), 16));//将要解密的字符串转换为等效的16位有符号数字
                inputByteArray[i] = (byte)i;
            }
            des.Key = ASCIIEncoding.ASCII.GetBytes(strKey);//获取密匙
            des.IV = ASCIIEncoding.ASCII.GetBytes(strKey);//获取对称算法的初始化向量
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);//将解密的文本           
            cs.FlushFinalBlock();//更新基础数据源或存储区，然后清除缓存区
            StringBuilder strBd = new StringBuilder();
            return System.Text.Encoding.Default.GetString(ms.ToArray());//建立StringBuilder对象，将解密后的流数据变成字符串输出
        }
        #endregion
}
